package com.itheima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.PageVo;
import com.itheima.admin.dto.ModuleDto;
import com.itheima.admin.dto.PageDto;
import com.itheima.admin.mapper.ModuleMapper;
import com.itheima.admin.pojo.Module;
import com.itheima.admin.service.IModuleService;
import com.itheima.admin.vo.ModuleVo;
import com.itheima.admin.vo.ModuleVoAll;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ModuleServiceImpl implements IModuleService {
    @Autowired
    private ModuleMapper moduleMapper;

    @Override
    public boolean deleteModule(String id) {
//        moduleMapper.deleteRoleModel(id);
        int i = moduleMapper.deleteById(id);
        return i > 0;
    }

    @Override
    public boolean addModule(ModuleDto moduleDto) {
        int insert = moduleMapper.insert(moduleDto.toMOdule());
        return insert > 0;

    }

    @Override
    public ModuleVo queryById(String id) {
        Module module = moduleMapper.selectById(id);
        ModuleVo moduleDto = new ModuleVo();
        BeanUtils.copyProperties(module, moduleDto);
        return moduleDto;
    }

    @Override
    public boolean updateModule(ModuleDto moduleDto) {
        Module module=new Module();
        boolean flag;
        BeanUtils.copyProperties(moduleDto,module);
        int i=  moduleMapper.updateById(module);
        if(i>0){
            flag=true;
        }
        else {
            flag=false;
        }
        return flag;
    }


    @Override
    public PageVo<ModuleVo> queryByPage(PageDto pageDto) {
        IPage<Module> page = new Page<>(pageDto.getCurrentPage(),pageDto.getPageSize());

        QueryWrapper<Module> queryWrapper = null;
        if(pageDto.getUsername() != null){
            queryWrapper = new QueryWrapper<>();
            queryWrapper.like("name",pageDto.getUsername());
        }

        IPage<Module> roleIPage = moduleMapper.selectPage(page, queryWrapper);

        List<ModuleVo> collect = getModuleVos(roleIPage.getRecords());
        return new PageVo<ModuleVo>(collect,(int)roleIPage.getTotal());
    }

    private List<ModuleVo> getModuleVos(List<Module> moduleIPage) {
        if(moduleIPage==null){
            return new ArrayList<>();
        }
        return moduleIPage.stream().map(
                module -> {
                    ModuleVo moduleVo = new ModuleVo();
                    BeanUtils.copyProperties(module, moduleVo);
                    moduleVo.setState(module.getState());
                    return moduleVo;
                }
        ).collect(Collectors.toList());
    }

    @Override
    public List<ModuleVoAll> selectAll() {
        List<Module> modules = moduleMapper.selectList(null);

        List<ModuleVoAll> byParentById = this.getByParentById("0", modules);
        return byParentById;
    }

    private List<ModuleVoAll> getByParentById(String pid,List<Module> modules){
        List<ModuleVoAll> list = new ArrayList<>();
        for (Module module : modules) {
            if(module.getParentId().equals(pid)){
                ModuleVoAll voAll = new ModuleVoAll();
                voAll.setLabel(module.getName());
                voAll.setId(module.getModuleId());
                voAll.setChildren(this.getByParentById(module.getModuleId(),modules));
                list.add(voAll);
            }
        }
        return list;
    }
}